Unite2018.day3
新機能Shader Graphを使えばプログラミング無しにシェーダーが作れるようになります!
Create > Shader > ShaderGraph > とかでサンプルが出る
右上のプロパティブラックボード、というところでプロパティを足せる。
-> それをグラフ上にD&Dでノードとして配置できる。パラメータを足せる。
具体的に作ってみる
ディゾルブ
・アルファカットアウトで
・際が光る
cutoff値よりも小さな部分を透明にする、
で、濃淡がある画像に対して行ったりすると、その形に抜けていく。
かつ、際の色を発光にする。
SampleTex2Dを作って、
石像に使われるノーマルマップをPBR Masterノードにセット
モデルは右下のほうでCustomなモデルにセットできる。
SampleNoiseを作って、MasterのAlphaに突っ込む
Vector1パラメータノードを作って、MasterのAlphaClipに突っ込む
-> この値をいじると、透明度が変わる。
閾値、Threatholdは、Stepノードを使う。
あるedge値をセットすると、流れ込んでくるものによって0か1を返す。
Stepに対してNoiseをインプット値として接続、Vector1ノードをedgeとしてセット
こうすることで、V1をedgeとしてインプット値を0か1にできる。
Timeノードを使う
ゲーム開始からの秒を返してくる
Fractionノードを使う
小数点以下を抜き出す
Time -> Fractionで反復Animationが作れる。
Fraction -> V1へと接続し、時間で変化する反復要素を組み込む。
プロバティブラックボードにカラーを新規作成し、そこからノードを作成する。
Multiplyノードを足して、カラー -> Mul -> Masterに接続すると、Untiyのプロパティからエッジのカラーをセットすることができる。
ゲージ
グラデーション素材とスレッショルドの合成で表現
・グラデーション素材を適当に作る
・Unlit Graphで作成(ライトの影響受けなくていいので
・半透明を使うので、Unlit Masterノードの設定を変更、 Opaque -> Transparent
円形ゲージに対して、中心から直線を引いてぐるりとグラデーションを回したようなグラデーションを用意する。
Tex2D
Step
V1
を用意、
V1 -> Stepのedge、
Tex2D -> Stepの値
とやって、
Remap
in(min ~ max)に入ったものを、out(min ~ max)の範囲で出力さっるよう一時変換するノード。
0 - 1で入れたものを、1-0にすることで入力を反転する。
Stepだと値がバッチリ切れてしまって、これで値を作るとテクスチャがジャギってしまう。
-> SmoothStep ノードを使って書き換え!
ゲージのエッジがいい感じに滑らかになった
ゲージの画像をmulノードで追加する。
2つの値を補完したり、アルファブレンディングするのはlerpノードを使うといい感じ。
荒ぶるテレビ
PBRシェーダ、
SampleTex2Dで対象の画像をインプット
ライトの色を黒にして無効化
Sinノード
Sin波を使って、横軸に入るしまを作ろう。
Splitノード
ベクトルを成分に分解する
ついとなるCombineノードは、A,R,G,Bなどからベクトルを作り出す。
Sin波をMulで200倍し、
Saturateノードで、-1 ~ 1のSinを、0 ~ 1に変換できる。
UVAnimationさせてみよう。
Time -> Mul -> Addを接続する。
Time -> GradientNoise -> 横にぶれるエフェクト、とやって、「ランダムな時間によってぶれる」みたいなのを実現する。
補足情報
今日の例はgithubにあるよ~~
https://github.com/keijiro/ShaderGraphExamples
CustomNodeの実装
既存のNodeを組み合わせてCustomNodeを作り出せる。なるほど。
スクリプトによるTimelineがっつり拡張入門
おさらい
・いろんなフィールドをコード無しで書き換え可能。
・パラメータさえMonoBehaviourであれば扱える。
Timeline(Playable)
PlayableDirectorComponent に入っている。
Track
Bindingしたものを扱う。
Cllipを含む
Clip
時間指定した効果
AnimationTrack
GOのパラメータをコントロールしたい時には使える。
例えばPostEffectとか、GOではないものはコントロールできない。スクリプトを書く必要がある。
次のような選択肢がある
1.AnimationTrack + MonoBehaviour
2.ControlTrack
3.CustomPlayable
1.AnimationTrack + MonoBehaviour
一番簡単、MonoBeで扱えばいい。
Updateとかでいじる。
2.ControlTrack
MonoBehaviour とITimeControl を実装する
Clipの開始、終了、再生中がわかればいい、という場合に有用。
OnControlTimeStart, SetTime(double) とかがある。
Clipの最大長は取れないので、こう、はい。事前に知っている必要がある。
3.CustomPlayable
専用トラックの定義。
Behaviour
クリップごと
Mixer
トラックごと
Mixerのほうが使いやすい。
・実時間を扱っているせいで、Behだと処理落ちで終了までのプロセス全てが動くわけではない、という可能性がある
Trackの拡張
BindingType(型)
Trackの色
TrackClipType(コンテキストメニューに現れるクリップのタイプ、複数貼るのが可能
TrackAssetを拡張、
override Playable CreateTrackMixer
Playable(今回はMixer)を生成する。
var mixer = ~して、
(この時点でmixerをこのコンテキストで保持しておくと、後からいじれるので良い、らしい。)
return mixer;
override void GatherProperties
Clipの(?)終了時にプロパティを戻す。
Mixer
トラック全てに対してイベントを発生させる。
全フレーム、Processメソッドの呼び出しが発生する。
Recordしたい、Timeline上でカーブ入れたい、、、
Clip内にBehaviourを持ち、bh内にパラメータを移動する。
Behaviour拡張はかならずSerializableをつける。
中のパラメータもpublicだったりSerializeFieldで定義する。
すると、それらは追跡できるようになる。
これらのClip内の物体は、メソッドを持たせず、全体を見通せるMixer上から編集するスタイルがいいと思う、みたいな。
さらなるスクリプト
AEからコンバートして再生!というのをやってみる。
MovieProxyPluginを使って、連番アニメーション限定、なるほど!!
あとでデータ見てみよ。
運営中コンテンツにおける大型アップデート成功のための考え方とUnity最適化手法
話題の大半が、ひたすら実践的かつ、「えっそれを決断してやれる組織あるんすか、、マジすか、、」みたいな顔になることが多かった。
シェーダ、グラフィックを大幅更新した話
リム、スペキュラ、環境マップは、キャラクターものを作る上で絵がダイレクトに影響を受けやすく、効果が高かった。
パラメータテクスチャを用意、テクスチャを用意してRGBで強度を調整する、という感じにした。
Unityの法線は1つしか持てない -> FBXからインポートすることもできない。
で、FBXを2つ作って、2つの法線をもつ -> 自前インポータを書いて2つの法線を持つデータにする!と。
CGFXをMayaとUnityで共有することで、プレビューを可能にした
すごーい!
Androidでのテクスチャのバンディング対策
ETC2 Normal使うと、0.5秒の圧縮時間と、バンドが出ない映像が得られることがわかった。
ETC2もっと早く使わなかった理由は?
・騎手が対応しているかどうかの判別手段がなかった
・ないところで使うと6倍のメモリをああああ
・Unityのバグもあった
並列AssetBundleビルド
manifestファイルさえあればそのビルドは発生しない(!)という特性を使い、
特定の単位でビルド対象を切って、manifestを共有していけば、新規や更新があった部分だけが作成される。
-> これめっちゃ素敵なのでパクろうと思う。
Unityキャッシュサーバ高速化
キャッシュのサイズを500GBにして対応、30分 -> 7分 とかになった。MacProを使った。
まとめの近所
まとめで、「誰が作ったものにもバグはあります、もちろんUnityにも。でもやっていきましょう」みたいな話があって、
ひたすらうなづいていた。
『CARAVAN STORIES』のアセットバンドル事例
めちゃくちゃ綺麗な絵の素敵なゲーム。
正規表現を駆使してResources -> AssetBundle ,,みたいな探索
これって開発中のみ?
->常に実用
すごいパワフル、、Resourcesのラッパ作ってそこでだけ行えばいいのでは感があるけど、ものすごい機構。
Unloadのくだり
2秒で自動unloadしてる
メモリに保持しておくのが惜しいのか~。なるほど。
それであれば、辞書を作ってそこにInstantiateしたのを持っておけば、即解放しちゃっていいのでは?
-> ABManagerがそんな感じの実装を持っているらしい。
ただ、音データとかをコピーなしで鳴らしていると、Unloadしたときに同時に消えちゃうはずで、確かにそんな感じになったというのが発表にあった。
variantのくだり
使わないほうがいい、Yes。ほんとにそれ。
AssetBundleNameを使ってると困るところがある
-> タイミング的に、Unityの負荷が高いところで使うとよく失敗してた気がする。
-> 後続のverでは滅びていた気がする。AssetGraphとかである程度できると思うけれど。
IDCFのCDNだと問題が出る
別にAWSでも発生するんでは、みたいな。クエリつけようねみたいな話だった。
スクリプタブルレンダーパイプライン入門
いろんなゲームのレベルがあるよね
Motivation
Unityのレンダリングをblackboxにしたくない、
カスタマイズの自由を提供したい。
APIs
Built-In Render Pipeline(will be dep)
既存
Lightweight(beta)
MobileとXR向け、一つの光源、
HighDefinition(preview)
ハイエンドPC向け
Custom
カスタム!!
どこから始めようか
Tips:ライトを切るとBatchやTrisがすごく減る
SRPの使い始め。
新規プロジェクト作成 > 作成ウィンドウでLWRPとかを選択したり、packageManagerから最新版をロードできる。
これらはLWRPのHigh,Middle, Lowとか。あとPostProessingがついてくる。
LWRPはそれぞれ設定の重量が違う状態のAsset(ScriptableRenderPipelineアセット)
このAssetを、
Project Settings > Graphics >
GraphicsSettingsのところに適当なLWRPAssetをセットすると、画面に対するパイプラインが変更される。
LWRPでのライト
メイン一個のみがサポートされている。
パフォーマンスよさげ。
Rendering設定 > PixelLight でPixelLightの数を調整できる。
これらのライトは影を落とさない。ので、描画計算に影響を与えない。
最大8。
DebugWindow
実行時に描画オプションをいじれる、、らしいがよくわからんかった。今度講演資料みよう。
CustomRenderPipelineについて
参考になるものといえば!みたいな話題
けいじろうさんのRetro3DPipeline
https://github.com/keijiro/Retro3DPipeline
あとgithubでScriptabkeRenderPipeline自体が公開されている。
https://github.com/Unity-Technologies/ScriptableRenderPipeline
そろそろ楽がしたい!新アセットバンドルワークフロー&リソースマネージャー詳細解説
・ScriptableBuildPipelineで、ビルド時などのサポートができる。すべてC#製。
・previewがリリースされている。0.0.22-preview
・エディタでのPlay時にABの更新をやってくれる
AssetReference
prefabみたいなもの。参照になるので、打ち間違いとかはない。
読み出し方
・AssetReferenceオブジェクトをインスペクタからセットしたりする。
・annotationでの型、ラベル(by Addressablesツール)指定で、扱うAssetの指定を行うことが可能。
・参照カウント方式なんで、消すときはReleaseを行う。
たぶん無視して種類全消しとかもできるのでは?
・同じロジックのままでDL元を変更できる。
・どこから取得するか、というのを、グループという単位で指定できる。
1.Local
2.Remote
3.Advanced
・ContentsCatalog、という全てのアドレス、ラベル、グループの情報が入ったファイルを生成する。json。
・ラベルによる事前ロードを行うことができる。
AutoyaでいうPreload。これ動的に生成できないかな、、
特定のラベルがついているAssetをすべて取得することができる。素晴らしい。
・Profile 設定集
Devとか切り替えるよね、ってやつ。素晴らしい。変数の列挙。
・PlayMode 設定
開発の状況に合わせてデータのロード方法を一括変更するパイプライン処理が選べる。
1.Fast(デフォルト、AssetDatabaseを見に行く
2.Virtual(ABに似せたロード経路を使う
3.Packed(ABを使う
・ResourceManagerProfiler
現在ロードされているResourceの情報が把握できる。
AddressableAssetsの役割
起動時処理でグループ設定情報をロード、カタログをロードして、というのをコードでやる。
任意のタイミングでキックできるかな?
ResourceManager
参照関連、寿命の管理を行う。
AsyncOpを返してくるので、ユーザー側で頑張る。
文字列、AssetReferenceを渡すと云々。
カスタマイズ
だいたいすべてのパーツが改造できそう。
たとえばリストであれば、ResLocator、ResProvicerをカスタマイズすればよさげ。
こういったカスタマイズは全て初期化時にセットするんかな。
Q&A
カタログをサーバ側で生json生成してかえしたい(ResLocatorとかをカスタマイズ?
-> カスタマイズできるよ!
カタログに独自値を加えたい、、!(verとかnameとか
-> カスタマイズできるよ!
複数のカタログを扱いたい(管理が楽(見た目関連、データ関連とか
-> appendという形でやるつもりらしい
カタログを更新するタイミングはユーザー定義でいつでもできる?
-> resLocMapをダイレクトに書き換えることで実現できるが、標準ではない
すでにAB使ってるタイミングでそのABを更新した内容のカタログを獲得したらどうなる?
-> 自作
カスタマイズは全て初期化時にセットする?
-> それ
特定のAssetRefの参照カウントを取得することはできる?
-> ない
ReleaseByAssetRef、とかで、特定のAssetRefを元にしてるassetsを一掃できる?
参照カウント管理は自分でやる、が、その機能は面白いんでお話。
RMのエラーハンドリングどうなってる感じ、isErrorみたいなのをやる?
-> いまのところ自作
カタログ更新によって使わなくなったABをどう扱うか
-> いまのところ自作
Preloadの並列数っていじれます?
-> 今はない、おもしろいと思うんでお話。
Preloadに使う引数を外部で生成することは受け付けられる?
ラベルは文字列なんでいける!
感想
紹介のされかた的に、「新しいUnityの仕組み」なのかな=~と思っていたが、実際にはこれはフレームワークなんだな~という理解になった。
・デフォルトかつ固定のフローが存在する。
・複数のパーツから構成され、パーツを自作することでフローに乗ったまま動作を変えられる
うん、これはフレームワークだ。
実際すべてUnity外のC#コードで書かれている、ということで、ほとんどAutoya(自作してるフレームワーク)と同じユースケースを果たせるような予感。
↑のQ&Aで聞いてた部分で、自分でやる、や、今後つくかも、といった部分に関して、Autoyaには含まれていてAddressableにはまだ、という状況なので、
今後めっちゃ使える形になってリリースされるのが待ち遠しい。